home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / keyboard / dvorakxt.asm < prev    next >
Assembly Source File  |  1985-06-13  |  5KB  |  157 lines

  1.         page 62,132
  2. ; keyboard program for ibm pc
  3. ; from page 404 of May 1983 BYTE magazine;
  4.  
  5. keyadr  equ     (offset keybrd - offset start) + 100h
  6. keylen  equ     offset keyend - offset keybrd
  7. tabadr  equ     (offset table - offset keybrd) + 5Ch
  8.  
  9. tabddr  equ     (offset tabled - offset keybrd) + 5Ch
  10. ctadr   equ     (offset ctable - offset keybrd) + 5Ch
  11. oaltlc  equ     (offset altlc - offset keybrd) + 5Ch
  12. oaltuc  equ     (offset altuc - offset keybrd) + 5Ch
  13.  
  14. kb_data equ     60h     ;keyboard data port
  15. kb_ctl  equ     61h     ;keyboard control port
  16.  
  17. data    segment at 40h
  18.         org     17h
  19. kb_flag label   byte    ;ram keyboard flag byte
  20.  
  21. data    ends
  22. cseg    segment
  23. assume  cs:cseg,ds:data
  24.  
  25.         org     100h
  26.  
  27. start:  mov     dx, 5Ch     ;set ds:dx to loc 5ch in program prefix
  28.         mov     al,9        ;set the keyboard interrupt (int9)
  29.         mov     ah,25h      ; to ds:dx via DOS function call
  30.         int     21h
  31.         mov     di,dx   ;move keyboard routine down so it starts
  32.         mov     si,keyadr       ; at loc 5ch in program prefix
  33.         mov     cx,keylen       ; (saves space)
  34.         jmp     finish
  35.  
  36. ;keyboard interrupt routine.  copy beginning of IBM PC ROM routne to 
  37. ;allow easy jump to later ROM code
  38.  
  39. keybrd: push    ax      ;Save registers used
  40.         push    bx
  41.         push    cx
  42.         push    dx
  43.         push    si
  44.         push    di
  45.         push    ds
  46.         push    es
  47.         cld
  48.         mov     ax,data
  49.         mov     ds,ax
  50.         sti
  51.         in      al,kb_data      ;get key code
  52.         push    ax
  53.         in      al,kb_ctl       ;restore keyboard
  54.         mov     ah,al
  55.         or      al,80h
  56.         out     kb_ctl,al
  57.         xchg    ah,al
  58.         out     kb_ctl,al
  59.         pop     ax
  60.         mov     ah,al   ;save key code
  61.  
  62. ;end of copied ROM code.  Start special translations
  63.  
  64.         cmp     al,0ffh ;overrun?
  65.         jz      romkey
  66.         mov     di,tabadr       ;translate key code
  67.         cmp     cs:dvorak,28    ;use dvorak table?
  68.         jnz     keybr0
  69.         mov     di,tabddr       ;y
  70. keybr0: and     al,7fh          ;kill make/break bit
  71.         call    trans
  72.         test    ah,80h          ;break code?
  73.         jnz     romky0
  74.  
  75.         test    kb_flag,4       ;no. Ctrl key presse
  76.         mov     di,ctadr
  77.         jz      altran
  78.         cmp     al,28           ;yep. enter key? (use dvorak?)
  79.         jz      keybr2
  80. keybr1: cmp     al,1            ;escape key?  (leave dvorak?)
  81.         jnz     tran
  82. keybr2: mov     cs:dvorak,al
  83.         jmp     far ptr k26     ;restore regs and reti
  84.                 
  85. altran: test    kb_flag,8       ;alt key pressed?
  86.         jz      romkey
  87.         mov     di,oaltlc
  88.         test    kb_flag,43h     ;shift?
  89.         jz      tran
  90.         mov     di,oaltuc
  91.  
  92. tran:   call    trans
  93.         jnz     romkey
  94.         jmp     far ptr k61
  95.  
  96. romky0: or      al,80h
  97. romkey: mov     ah,al
  98.         jmp             far ptr romadr
  99.  
  100. ;translate routine.  Replaces byte in string [di] by byte following
  101. ; matched byte.  Returns Z if no match found; NZ if match found.
  102.  
  103. trans:  cmp     al,cs:[di]
  104.         jz      xfnd
  105.         inc     di
  106.         inc     di
  107.         cmp     byte ptr cs:[di],0
  108.         jnz     trans
  109.         or      al,al
  110.         ret                             ;RNZ
  111. xfnd:   mov     al,cs:1[di]
  112.         ret                             ;RZ
  113.  
  114.  
  115. finish: rep     movsb
  116.         mov     dx,di           ;end pgm but leave keyboard resident
  117.         int     27h
  118.  
  119. dvorak  db      28       ;dvorak flag
  120.  
  121. table   db      43,42,74,43,0   ;backslash -> left shift, keypad- -> backslash
  122.  
  123. ;for a Dvorak keyboard use
  124.  
  125. tabled  db   16,40,17,51,18,52,19,25,20,21,21,33,22,34,23,46,24,19,25,38,26,26
  126.         db   30,30,31,24,32,18,33,22,34,23,35,32,36,35,37,20,38,49,39,31,40,53
  127.         db   44,39,45,16,46,36,47,37,48,45,49,48,50,50,51,17,52,47,53,44,0
  128.  
  129. ctable  db      15,15,72,21     ;ctl_backtab-> ctl-O, ctl-uparrow->ctl-u
  130.         db      80,10,0 ;ctl-downarrow->ctl-j
  131.  
  132. altlc   db      30,132,46,135,18,130,49,164,24,148,22,129,23,161,51,174,52,175
  133.         db      02,173,53,168,03,253,13,240,32,235,0
  134. altuc   db      30,142,46,128,18,138,49,165,24,153,22,154,02,173,53,168,05,156
  135.         db      41,247,13,241,32,127,0
  136.  
  137. keyend:
  138.  
  139.  
  140. cseg    ends
  141.  
  142. rom     segment         at 0f000h ;IBM ROM BIOS keyboard entry points
  143.         assume  cs:rom
  144.         org     0e9a6h
  145. romadr  label   far             ;perform all bu initial processing
  146.  
  147.         org     0ea59h
  148. k26     label   far             ;restore registers and return
  149.  
  150.         org     0ea7ch
  151. k1234   label   far             ;reboot (ctl-alt-del addr)
  152.         org     0ec05h
  153. k61     label   far             ;store char in keyboard buffer and return
  154. rom     ends
  155.  
  156.         end     start
  157.